/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * PanelConsultaNoPredefinida.java
 *
 * Created on 2/01/2012, 05:08:11 PM
 */
package gui;

import gui.treeQuery.CheckBoxNode;
import gui.treeQuery.NodeSelectionListener;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.ButtonModel;
import javax.swing.GroupLayout;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.border.TitledBorder;
import manejadorConsultas.ConsultasDatamart;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.plot.PlotOrientation;

/**
 *
 * @author jorgeorm
 */
public class PanelConsultaNoPredefinida extends javax.swing.JPanel {
    private HashMap<CheckBoxNode, Boolean> grupo;
    private CheckBoxNode root;
    private PanelQuerysEnTexto jp_queryTexto;
    private HashMap<String, String>correspondFactTable, correspNombASql, correspDimAdimK,correspondNomaTable, correspHechSql;
    private HashMap<String,JPanel> hm_informacion;
    private NodeSelectionListener listenerArbol;
    /** Creates new form PanelConsultaNoPredefinida */
    public PanelConsultaNoPredefinida() {
        super();

        //        Fin del código mio
//        
        jp_queryTexto=new PanelQuerysEnTexto();
        initCorrespondencias();
        initArbol();
        initComponents();
        bg_grupoPaQuery.add(jtb_formInteractivo);
        bg_grupoPaQuery.add(jtb_queryTexto);
        this.setVisible(true);
    }
    
    private void initCorrespondencias(){
         
        correspHechSql= new HashMap<String, String>();
        correspHechSql.put("1Cancelaciones","*");
        correspHechSql.put("1Matriculas","*");
        correspHechSql.put("Total","totalmatricula");
        correspHechSql.put("Num Matricula","numerocurosMatriculados");
        correspHechSql.put("Num Cancelaciones","numerocursosCancelados");
        correspHechSql.put("Num Matri Mujeres","matriculaMujeres");
        correspHechSql.put("Num Matri Hombres","matriculaHombres");
        
        correspondNomaTable= new HashMap<String, String>();
        correspondNomaTable.put("Programa Académico","programa_academico");
        correspondNomaTable.put("Fecha","fecha");
        correspondNomaTable.put("Hora","hora");
        correspondNomaTable.put("Locacion","locacion");
        correspondNomaTable.put("Asignatura","asignatura");
        correspondNomaTable.put("Estudiante","estudiante");
        correspondNomaTable.put("Demograficos","demograficos");
        correspondNomaTable.put("Matriculas","matricula");
        correspondNomaTable.put("Cancelaciones","cancelaciones");
        correspondNomaTable.put("MatriculasxLocacion","matriculaxlocacion");
        
        
        correspDimAdimK=new HashMap<String, String>();
        correspDimAdimK.put("Tabulado","tabulado_dd");
        correspDimAdimK.put("Fecha","fecha_k");
        correspDimAdimK.put("Hora","hora_k");
        correspDimAdimK.put("Estudiante","estudiante_k");
        correspDimAdimK.put("Programa Académico", "programa_k");
        correspDimAdimK.put("Demograficos","demograficos_k");
        correspDimAdimK.put("Asignatura","asignatura_k");
        correspDimAdimK.put("Locacion","locacion_k");
        
        correspondFactTable= new HashMap<String, String>();
        correspondFactTable.put("programa_k","programa");
        correspondFactTable.put("fecha_k","fecha");
        correspondFactTable.put("hora_k","hora");
        correspondFactTable.put("locacion_k","locacion");
        correspondFactTable.put("asignatura_k","asignatura");
        correspondFactTable.put("estudiante_k","estudiante");
        correspondFactTable.put("demograficos_k","demografia");
//       HashMap para pasar del nombre enl a GUI al sql
//        
        correspNombASql= new HashMap<String, String>();
//        Programa
//        
        correspNombASql.put("Código Prog.", "codigo");
        correspNombASql.put("Nombre Prog.", "nombre");
        correspNombASql.put("SNIES", "snies");
        correspNombASql.put("Duración Semestres", "duracionsemestres");
        correspNombASql.put("Total Creditos", "totalcreditos");
        correspNombASql.put("Nivel Prog.", "nivel_programa");
        correspNombASql.put("Acreditación", "acreditacion");
        correspNombASql.put("Facultad/Instituto","enteqofrece");
//        Fecha
//        
        correspNombASql.put("Año","anho");
        correspNombASql.put("Num. Semestre","semestre");
        correspNombASql.put("Nomb. Semestre","nombresemestre");
        correspNombASql.put("Num. Mes", "mes");
        correspNombASql.put("Nomb. Mes", "nombremes");
        correspNombASql.put("Día", "dia");
//        @TODO: Mirar como quedó en la tabla
        correspNombASql.put("Num. Día", "numerodia");
        correspNombASql.put("Nomb. Día", "nombredia");
        correspNombASql.put("Festivo?","festivo");
//        Hora
//        
        correspNombASql.put("Jornada", "jornada");
        correspNombASql.put("Franja", "franja");
        correspNombASql.put("Hora", "hora");
//        Locación
//        
        correspNombASql.put("Facultad", "facultad");
        correspNombASql.put("Escuela/Instituto", "escuela_instituto");
        correspNombASql.put("No. Edificio", "edificio");
        correspNombASql.put("No. Espacio", "espacio");
        correspNombASql.put("Num. Equipos", "numequipos");
        correspNombASql.put("Dir. IP de Equipo", "ipequipo");
//        Asignatura
//        
        correspNombASql.put("Código Asign.", "codigo");
        correspNombASql.put("Nombre Asign.","nombre");
        correspNombASql.put("Abreviación","abreviacion");
        correspNombASql.put("No. Creditos","creditos");
        correspNombASql.put("Grupo","grupo");
        correspNombASql.put("Nivel Asign.","nivel");
        correspNombASql.put("Tipo Asign.","tipoasignatura");
        correspNombASql.put("Generico?","generico");
        correspNombASql.put("Anual?","anual");
        correspNombASql.put("Habilitable?","habilitable");
        correspNombASql.put("Validable?","validable");
        correspNombASql.put("Profesor Encarg.","profesorencargado");
//        Estudiante
//        
        correspNombASql.put("Código Est.","codigo");
        correspNombASql.put("Nombres Est.", "nombres");
        correspNombASql.put("Apellidos Est.", "apellidos");
        correspNombASql.put("Num. Doc. Ident.","numdocidentidad");
        correspNombASql.put("Fecha Nacimiento", "fechanacimiento");
        correspNombASql.put("Año Ingreso", "añoingreso");
        correspNombASql.put("Programa Acad. Est.","programa_acad");
        correspNombASql.put("Puesto Icfes","puestoicfes");
        correspNombASql.put("Año Icfes", "anhoicfes");
        correspNombASql.put("Puntaje Biologia", "puntajeicbiologia");
        correspNombASql.put("Puntaje Lenguaje","puntajeiclenguaje");
        correspNombASql.put("Puntaje Matematica","puntajeicmatematica");
        correspNombASql.put("Puntaje Sociales","puntajeiccien_sociales");
        correspNombASql.put("Puntaje Filosofia","puntajeicfilosofia");
        correspNombASql.put("Puntaje Quimica","puntajeicquimica");
        correspNombASql.put("Puntaje Fisica","puntajeicfisica");
        correspNombASql.put("Puntaje Ingles","puntajeicingles");
//        Demograficos
//        
        correspNombASql.put("Edad","edad");
        correspNombASql.put("Sexo","sexo");
        correspNombASql.put("Estado Civil","estadocivil");
        correspNombASql.put("Estrato","estratosocioe");
        correspNombASql.put("Colegio","colegiograduando");
        correspNombASql.put("Tipo Colegio","tipocolegio");
        correspNombASql.put("Trabaja?","trabaja");
        correspNombASql.put("Personas a Cargo","personasacargo");
        correspNombASql.put("Num. Hermanos","numhermanos");
        correspNombASql.put("Escolaridad Padre","escolaridadpadre");
        correspNombASql.put("Escolaridad Madre","escolaridadmadre");
            
    }
    
    private void initArbol(){
        root=new CheckBoxNode("Raiz");
        grupo= new HashMap<CheckBoxNode, Boolean> ();
        
        String nomAtributosPrograma[]={
            "Código Prog.",
            "Nombre Prog.",
            "SNIES",
            "Duración Semestres",
            "Total Creditos",
            "Nivel Prog.",
            "Acreditación",
            "Facultad/Instituto"
        };
        String nomAtributosFecha[]={
            "Año",
            "Num. Semestre",
            "Nomb. Semestre",
            "Num. Mes",
            "Nomb. Mes",
            "Día",
            "Num. Día",
            "Nomb. Día",
            "Festivo?"
        };
        String nomAtributosHora[]={
            "Jornada",
            "Franja",
            "Hora"
        };
        String nomAtributosLocacion[]={
//          @TODO: Colocar aviso del NO en el form  
            "Facultad",
            "Escuela/Instituto",
            "No. Edificio",
            "No. Espacio",
            "Num. Equipos",
            "Dir. IP de Equipo"
        };
        String nomAtributosAsignatura[]={
            "Código Asign.",
            "Nombre Asign.",
            "Abreviación",
            "No. Creditos",
            "Grupo Asign",
            "Nivel Asign.",
            "Tipo Asign",
            "Generico?",
            "Anual?",
            "Habilitable?",
            "Validable?",
            "Profesor Encarg."
        };
        String nomAtributosEstudiante[]={
            "Código Est.",
            "Nombres Est.", 
            "Apellidos Est.", 
            "Num. Doc. Ident.",
            "Fecha Nacimiento", 
            "Año Ingreso", 
            "Programa Acad. Est.",
            "Puesto Icfes",
            "Año Icfes", 
            "Puntaje Biologia", 
            "Puntaje Lenguaje",
            "Puntaje Matematica",
            "Puntaje Sociales",
            "Puntaje Filosofia",
            "Puntaje Quimica",
            "Puntaje Fisica",
            "Puntaje Ingles"
        };
        String nomAtributosDemograficos[]={
            "Edad",
            "Sexo",
            "Estado Civil",
            "Estrato",
            "Colegio",
            "Tipo Colegio",
            "Trabaja?",
            "Personas a Cargo",
            "Num. Hermanos",
            "Escolaridad Padre",
            "Escolaridad Madre"
        };
        
        String nomHechosMatri[]={
            "1"
        };
        String nomHechosCance[]={
            "1"
        };
        String nomHechosMatrixLoc[]={
            "Total",
            "Num Matricula",
            "Num Cancelaciones",
            "Num Matri Mujeres",
            "Num Matri Hombres"
        };
//        String nomHechosCancexLoc[]={
//            ""
//        };
//        
        String nomEstrellas[]={
            "Matriculas",
            "Cancelaciones",
            "MatriculasxLocacion"
//                ,
//            "CancelacionesxLocacion"
        };
        
        String nomDimensiones []={
            "Tabulado",
            "Fecha",
            "Hora",
            "Estudiante",
            "Programa Académico",
            "Demograficos",
            "Asignatura",
            "Locacion"
        };
        
        boolean [] partiDimensMatri={
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true
        };
        boolean [] partiDimensCanc={
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true
        };
        boolean [] partiDimensMatxLoca={
            false,
            true,
            true,
            false,
            true,
            false,
            true,
            true
        };
//        CargaNueva
//

//        Dimensiones
//        
//        System.out.println(nomDimensiones.length+"");
        ArrayList<CheckBoxNode> nodosDim=new ArrayList<CheckBoxNode>(nomDimensiones.length);
//        System.out.println(nodosDim.size()+"");

        for (int i = 0; i < nomDimensiones.length; i++) {
            String nombreDim=nomDimensiones[i];
            CheckBoxNode nodoDim= new CheckBoxNode(nombreDim.toString());
            
//        AtributosDimension x Dimension
//        
            String[]nomAtributos=null;
            if(nombreDim.equals("Programa Académico")){
                nomAtributos=nomAtributosPrograma;
            }
            else if(nombreDim.equals("Fecha")){
                nomAtributos=nomAtributosFecha;
            }
            else if(nombreDim.equals("Hora")){
                nomAtributos=nomAtributosHora;
            }
            else if(nombreDim.equals("Locacion")){
                nomAtributos=nomAtributosLocacion;
            }
            else if(nombreDim.equals("Asignatura")){
                nomAtributos=nomAtributosAsignatura;
            }
            else if(nombreDim.equals("Estudiante")){
                nomAtributos=nomAtributosEstudiante;
            }
            else if(nombreDim.equals("Demograficos")){
                nomAtributos=nomAtributosDemograficos;
            }else if(nombreDim.equals("Tabulado")) {
                nodosDim.add(nodoDim.clone());
                continue;
            }            
//            Cargo atributos en la dimensión.
//                System.out.println(nodoDim);
                for (int j = 0; j < nomAtributos.length; j++) {
                    
                    String nomAtrib = nomAtributos[j];
                    CheckBoxNode nodoAtrib=new CheckBoxNode(nomAtrib.toString());
                    nodoDim.add(nodoAtrib);
//                    System.out.println("--"+nodoAtrib);
    //                nodosAtrribDim.set(j,new CheckBoxNode(string));
                }
                nodosDim.add(nodoDim.clone());
            
        }
        
//        Estrellas
//        
        ArrayList<CheckBoxNode>nodosEst=new ArrayList<CheckBoxNode>(nomEstrellas.length);
//        System.out.println(nomEstrellas.length);
//        System.out.println(nodosEst.size());
        for (int i = 0; i < nomEstrellas.length; i++) {
            String nomEstrella = nomEstrellas[i];
            CheckBoxNode nodoEstrella=new CheckBoxNode(nomEstrella.toString());
            CheckBoxNode dimensiones=new CheckBoxNode("Dimensiones");
            boolean[] restricciones=null;
//            Cargo los Hechos
            String[] nomHechos=null;
            if(nomEstrella.equals("Matriculas")){
                nomHechos=nomHechosMatri;
                restricciones=partiDimensMatri;
            }
            else if(nomEstrella.equals("Cancelaciones")){
                nomHechos=nomHechosCance;
                restricciones=partiDimensCanc;
            }
            else if(nomEstrella.equals("MatriculasxLocacion")){
                nomHechos=nomHechosMatrixLoc;
                restricciones=partiDimensMatxLoca;
            }
            else continue;
            for (int j = 0; j < nomHechos.length; j++) {
                String hecho = nomHechos[j];
                CheckBoxNode tmp= new CheckBoxNode(hecho.toString());
                tmp.setHasGroup(true);
                grupo.put(tmp, false);
                nodoEstrella.add(tmp);
            }
//            Cargo Dimensiones
            for(int j=0; j< nodosDim.size();j++)
            {
//                System.out.println(nodosDim.get(j).toString());
                if(restricciones[j]){
                    dimensiones.add((nodosDim.get(j)).clone());
                }
            }
            nodoEstrella.add(dimensiones.clone());
            nodosEst.add(nodoEstrella.clone());
        }

        for(int i=0;i<nodosEst.size();i++){
            root.add(nodosEst.get(i));
        }
    
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        bg_grupoPaQuery = new javax.swing.ButtonGroup();
        jp_menuEstrellas = new javax.swing.JPanel();
        jsp_scrollTree = new javax.swing.JScrollPane();
        arbolMenu = new javax.swing.JTree(root);
        jtb_formInteractivo = new javax.swing.JToggleButton();
        jtb_queryTexto = new javax.swing.JToggleButton();
        jb_enviarQuery = new javax.swing.JButton();
        jp_consulta = new javax.swing.JPanel();
        jtp_queryInter = new javax.swing.JTabbedPane();
        jtp_pansGraficas = new javax.swing.JTabbedPane();
        jsp_tablaResultadosInter = new javax.swing.JScrollPane();
        jt_resultConsultaInter = new javax.swing.JTable();
        jsp_textQueryInter = new javax.swing.JScrollPane();
        jta_textQueryInter = new javax.swing.JTextArea();

        setPreferredSize(new java.awt.Dimension(999, 549));

        arbolMenu.setCellRenderer(new gui.treeQuery.CheckBoxRenderer());
        //arbolMenu.getSelectionModel().setSelectionMode(
            //  javax.swing.tree.TreeSelectionModel.SINGLE_TREE_SELECTION
            //);
        arbolMenu.setRootVisible(false);
        arbolMenu.putClientProperty("JTree.lineStyle", "Angled");
        listenerArbol=new gui.treeQuery.NodeSelectionListener(arbolMenu, grupo);
        arbolMenu.addMouseListener(listenerArbol);
        jsp_scrollTree.setViewportView(arbolMenu);

        jtb_formInteractivo.setText("Form Query");
        jtb_formInteractivo.setToolTipText("Genera un Formulario para llenar los parametros en los cuales se basará el query y se le indicará con qué atributo se hara el agrupamiento.");
        jtb_formInteractivo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jtb_formInteractivoActionPerformed(evt);
            }
        });

        jtb_queryTexto.setText("Query en Texto");
        jtb_queryTexto.setToolTipText("Abre un panel que contiene un campo de texto para elaborar la query a mano");
        jtb_queryTexto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jtb_queryTextoActionPerformed(evt);
            }
        });

        jb_enviarQuery.setText("Enviiar Query");
        jb_enviarQuery.setEnabled(false);
        jb_enviarQuery.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jb_enviarQueryActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jp_menuEstrellasLayout = new javax.swing.GroupLayout(jp_menuEstrellas);
        jp_menuEstrellas.setLayout(jp_menuEstrellasLayout);
        jp_menuEstrellasLayout.setHorizontalGroup(
            jp_menuEstrellasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jp_menuEstrellasLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jp_menuEstrellasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jb_enviarQuery, javax.swing.GroupLayout.DEFAULT_SIZE, 203, Short.MAX_VALUE)
                    .addComponent(jsp_scrollTree, javax.swing.GroupLayout.PREFERRED_SIZE, 203, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jtb_formInteractivo, javax.swing.GroupLayout.DEFAULT_SIZE, 203, Short.MAX_VALUE)
                    .addComponent(jtb_queryTexto, javax.swing.GroupLayout.DEFAULT_SIZE, 203, Short.MAX_VALUE)))
        );
        jp_menuEstrellasLayout.setVerticalGroup(
            jp_menuEstrellasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jp_menuEstrellasLayout.createSequentialGroup()
                .addComponent(jsp_scrollTree, javax.swing.GroupLayout.DEFAULT_SIZE, 429, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jb_enviarQuery)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jtb_formInteractivo)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jtb_queryTexto)
                .addGap(12, 12, 12))
        );

        jt_resultConsultaInter.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jt_resultConsultaInter.setPreferredSize(new java.awt.Dimension(380, 72));
        jsp_tablaResultadosInter.setViewportView(jt_resultConsultaInter);

        jta_textQueryInter.setColumns(20);
        jta_textQueryInter.setEditable(false);
        jta_textQueryInter.setLineWrap(true);
        jta_textQueryInter.setRows(5);
        jta_textQueryInter.setPreferredSize(new java.awt.Dimension(380, 90));
        jsp_textQueryInter.setViewportView(jta_textQueryInter);

        jfc_chartBarras=org.jfree.chart.ChartFactory.createBarChart3D("Barras", "Clases", "Cuentas", null, org.jfree.chart.plot.PlotOrientation.HORIZONTAL, true, true, true);
        jfc_chartTorta=org.jfree.chart.ChartFactory.createPieChart3D("Tortas", null, true, true, new java.util.Locale("es","CO"));
        cp_torta=new org.jfree.chart.ChartPanel(jfc_chartTorta);
        cp_barra=new org.jfree.chart.ChartPanel(jfc_chartBarras);

        javax.swing.GroupLayout jp_consultaLayout = new javax.swing.GroupLayout(jp_consulta);
        jp_consulta.setLayout(jp_consultaLayout);
        jp_consultaLayout.setHorizontalGroup(
            jp_consultaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jtp_pansGraficas, javax.swing.GroupLayout.DEFAULT_SIZE, 781, Short.MAX_VALUE)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jp_consultaLayout.createSequentialGroup()
                .addComponent(jtp_queryInter, javax.swing.GroupLayout.DEFAULT_SIZE, 395, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jp_consultaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jsp_textQueryInter, javax.swing.GroupLayout.DEFAULT_SIZE, 368, Short.MAX_VALUE)
                    .addComponent(jsp_tablaResultadosInter, javax.swing.GroupLayout.PREFERRED_SIZE, 368, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
        jp_consultaLayout.setVerticalGroup(
            jp_consultaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jp_consultaLayout.createSequentialGroup()
                .addGroup(jp_consultaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(jp_consultaLayout.createSequentialGroup()
                        .addComponent(jsp_textQueryInter, javax.swing.GroupLayout.DEFAULT_SIZE, 123, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jsp_tablaResultadosInter, javax.swing.GroupLayout.PREFERRED_SIZE, 133, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jp_consultaLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jtp_queryInter, javax.swing.GroupLayout.PREFERRED_SIZE, 259, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jtp_pansGraficas, javax.swing.GroupLayout.DEFAULT_SIZE, 269, Short.MAX_VALUE)
                .addContainerGap())
        );

        jtp_pansGraficas.addTab("Representación Torta", cp_torta);
        jtp_pansGraficas.addTab("Representación Barras", cp_barra);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addComponent(jp_menuEstrellas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jp_consulta, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jp_consulta, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jp_menuEstrellas, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
    }// </editor-fold>//GEN-END:initComponents

    private void jtb_queryTextoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jtb_queryTextoActionPerformed
        javax.swing.GroupLayout jp_consultaLayout = (GroupLayout)jp_consulta.getLayout();
        try{
            jp_consultaLayout.replace(jtp_queryInter, jp_queryTexto );
        }catch(Exception excp){
            System.err.println("No se pudo sacar El texto del query");
        }
        
        jb_enviarQuery.setEnabled(true);
  }//GEN-LAST:event_jtb_queryTextoActionPerformed

    private void jtb_formInteractivoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jtb_formInteractivoActionPerformed
        javax.swing.GroupLayout jp_consultaLayout = (GroupLayout)jp_consulta.getLayout();
        this.hm_informacion=llenarJtpQueryInter();        
        try{
            jp_consultaLayout.replace(jp_queryTexto, jtp_queryInter);
        }catch(Exception excp){
            System.err.println("No se pudo sacar El texto del query");
        }
        jb_enviarQuery.setEnabled(true);
    }//GEN-LAST:event_jtb_formInteractivoActionPerformed

    private HashMap<String,JPanel> llenarJtpQueryInter(){
        jtp_queryInter.removeAll();
        GridBagConstraints rstricsGridBag;
        ArrayList <CheckBoxNode> seleccionDims=listenerArbol.getSeleccionDims();
//        CheckBoxNode hecho=listenerArbol.nodoSeleccionado();
        HashMap<String,JPanel> hashPans= new HashMap<String, JPanel>();
        int y;
        String [] operadores={
                "=",
                "<",
                "<=",
                ">",
                ">=",
                "LIKE"
            };
        y=0;
//            En base a las dimensiones creo los paneles
        for (Iterator<CheckBoxNode> it = seleccionDims.iterator(); it.hasNext();) {
        CheckBoxNode attribSel = it.next();
            String padre=((CheckBoxNode)attribSel.getParent()).toString();
            JPanel panDim=null;
            JRadioButton jrb_agrupxAtrib,jrb_ordenarxAtrib;
            JTextField jtf_valorAtrib;

            JComboBox jcb_operadores=new JComboBox(operadores);
            
            if(!hashPans.containsKey(padre))
            {
                y=0;
                panDim=new JPanel();
                panDim.setName(padre.toString());
                panDim.setBorder(BorderFactory.createTitledBorder
                        (null, padre.toString(), javax.swing.border.TitledBorder.CENTER, 
                        TitledBorder.ABOVE_TOP, new Font("Arial", 2, 12))); // NOI18N
                panDim.setMaximumSize(new Dimension(350,74));
                panDim.setMinimumSize(new Dimension(350,74));
                panDim.setSize(new Dimension(350,74));


                panDim.setLayout(new GridBagLayout());
//                Añado label con el nombre de la dimensión
//                
                rstricsGridBag= new GridBagConstraints();
//                rstricsGridBag.fill = java.awt.GridBagConstraints.HORIZONTAL;
                rstricsGridBag.anchor = java.awt.GridBagConstraints.WEST;

                panDim.add(new JLabel("Ordenar?"), rstricsGridBag);
                
                rstricsGridBag= new GridBagConstraints();
//                rstricsGridBag.fill = java.awt.GridBagConstraints.HORIZONTAL;
                rstricsGridBag.gridx=1;
                rstricsGridBag.gridy=0;
                rstricsGridBag.anchor = java.awt.GridBagConstraints.WEST;

                panDim.add(new JLabel("Agrupar?"), rstricsGridBag);
                y++;
            }else{
                panDim=hashPans.get(padre);
            }
        //              Añado RadioButton de Ordenar
        //                
            jrb_ordenarxAtrib=new JRadioButton();
            rstricsGridBag= new GridBagConstraints();
            rstricsGridBag.gridx=0;
            rstricsGridBag.gridy=y;
//            rstricsGridBag.anchor = java.awt.GridBagConstraints.WEST;
//            rstricsGridBag.fill = java.awt.GridBagConstraints.HORIZONTAL;
            panDim.add(jrb_ordenarxAtrib,rstricsGridBag);

            
//              Añado RadioButton del atributo
//                
            jrb_agrupxAtrib=new JRadioButton(attribSel.toString(), false);
            rstricsGridBag= new GridBagConstraints();
            rstricsGridBag.gridx=1;
            rstricsGridBag.gridy=y;
            rstricsGridBag.weightx=125.0;
            rstricsGridBag.anchor = java.awt.GridBagConstraints.WEST;            
//            rstricsGridBag.fill = java.awt.GridBagConstraints.HORIZONTAL;
            panDim.add(jrb_agrupxAtrib,rstricsGridBag);
//Añado OPerador a utilizar en el formulario
//            
            rstricsGridBag= new GridBagConstraints();
            rstricsGridBag.gridx=2;
            rstricsGridBag.gridy=y;
            rstricsGridBag.weightx=50.0;
            rstricsGridBag.anchor = java.awt.GridBagConstraints.WEST;

            panDim.add(new JComboBox(jcb_operadores.getModel()),rstricsGridBag);
            //              Añado TextField del RadioButton
        //                
            jtf_valorAtrib= new JTextField();
            jtf_valorAtrib.setMinimumSize(new java.awt.Dimension(120, 28));
//            jtf_valorAtrib.setSize(new java.awt.Dimension(120, 28));
            jtf_valorAtrib.setPreferredSize(new java.awt.Dimension(120, 28));
            rstricsGridBag= new GridBagConstraints();
            rstricsGridBag.gridx=3;
            rstricsGridBag.gridy=y;
            rstricsGridBag.weightx=125.0;
            rstricsGridBag.anchor = java.awt.GridBagConstraints.WEST;
            rstricsGridBag.fill = java.awt.GridBagConstraints.HORIZONTAL;

            panDim.add(jtf_valorAtrib,rstricsGridBag);
            y++;
            hashPans.put(padre,panDim);
        }
        
        Iterator it= hashPans.entrySet().iterator();
        while(it.hasNext())
        {
            Entry<String, JPanel> tupla= (Entry<String, JPanel>)it.next();
            jtp_queryInter.add(tupla.getKey(), tupla.getValue());
        }
        return hashPans;
    }
    
    private String armarQuery(){
        String query="";
        String querySel="SELECT ";
        String queryFrom="FROM ( ";
//        System.out.println("Busco por los que hay que agrupar");
        Iterator it_info=hm_informacion.entrySet().iterator();
        ArrayList <String> listaGroups=new ArrayList<String>();
        ArrayList <String> querysInternas=new ArrayList<String>();
        
        while(it_info.hasNext())
        {
            Entry<String, JPanel> e_info=(Entry<String,JPanel>)it_info.next();
            JPanel jp_infoTmp=e_info.getValue();
            ArrayList<String> listaOrdens= new ArrayList<String>();
            ArrayList<String> listaCondiciones= new ArrayList<String>();
            ArrayList <String> listaGroupsInter=new ArrayList<String>();

//            Proceso el Form
//            
            String queryInternaFull="";
            String nomKey=correspDimAdimK.get(((TitledBorder)jp_infoTmp.getBorder()).getTitle());
            String queryInternaSeleccion="SELECT "+nomKey+" AS "+correspondFactTable.get(nomKey);
            String queryInternaDe=" FROM "+correspondNomaTable.get(((TitledBorder)jp_infoTmp.getBorder()).getTitle());
            String queryInternaCondi=" WHERE ";
            for(int i=2; i<jp_infoTmp.getComponentCount();i+=4)
            {
                
                JRadioButton jrb_ordenar=(JRadioButton) jp_infoTmp.getComponent(i);
                JRadioButton jrb_agrupar=(JRadioButton) jp_infoTmp.getComponent(i+1);;
                JComboBox jcb_operador=(JComboBox) jp_infoTmp.getComponent(i+2);
                JTextField jtf_valor=(JTextField) jp_infoTmp.getComponent(i+3);;
                
                if(jrb_agrupar.isSelected()){
                    listaGroupsInter.add(this.correspNombASql.get(jrb_agrupar.getText()));                    
                }
                if(jrb_ordenar.isSelected()){
                    System.out.println("Boton seleccionado: "+jrb_agrupar.getText());
                    listaOrdens.add(this.correspNombASql.get(jrb_agrupar.getText()));
                }
                if(jtf_valor.getText().length()>0)
                {
                    System.out.println("Tamaño texto en form: "+jtf_valor.getText().length());
                    listaCondiciones.add(this.correspNombASql.get(jrb_agrupar.getText())+" "+jcb_operador.getSelectedItem()+" "+jtf_valor.getText());
                }
            }
            if(!(listaGroupsInter.isEmpty())){
                Iterator it_lista= listaGroupsInter.iterator();
                while(it_lista.hasNext())
                {
                    String atributo=(String)it_lista.next();;
                    System.out.println(atributo);
                    queryInternaSeleccion+=", ";
                    queryInternaSeleccion+=atributo;
                }
            }
            if(!(listaCondiciones.isEmpty())){
                Iterator it_lista= listaCondiciones.iterator();
                while(it_lista.hasNext())
                {
                    queryInternaCondi+=it_lista.next();
                    if(it_lista.hasNext()) queryInternaCondi+=" AND ";
                }
            }
            if(!(listaOrdens.isEmpty())){
                Iterator it_lista= listaOrdens.iterator();
                while(it_lista.hasNext())
                {
                    queryInternaCondi+=" ORDER BY ";
                    queryInternaCondi+=it_lista.next();
                    if(it_lista.hasNext()) queryInternaCondi+=" , ";
                }                            
            }
            listaGroups.addAll(listaGroupsInter);
            queryInternaFull=queryInternaSeleccion+queryInternaDe;
            if(!(queryInternaCondi.equals(" WHERE "))) queryInternaFull+=queryInternaCondi;
            querysInternas.add(queryInternaFull);
        }
        if(!(listaGroups.isEmpty())){
            Iterator it_lista= listaGroups.iterator();
            while(it_lista.hasNext())
            {
                querySel+=it_lista.next();
                if(it_lista.hasNext()) querySel+=" , ";
            }
        }
        String tablaHecho=((CheckBoxNode)this.listenerArbol.nodoHechoSeleccionado().getParent()).toString();
        String hecho=this.listenerArbol.nodoHechoSeleccionado().toString();
        System.out.println("Hecho: "+hecho);
        querySel+=", SUM( "+correspHechSql.get(hecho) +" ) AS sum"+correspHechSql.get(hecho);
        if(!(querysInternas.isEmpty()))
        {
            int contador=0;
            String nomQ="Query";
            String queryInicial=querysInternas.remove(0);
            queryInicial=" ( "+queryInicial+" ) AS "+nomQ+contador;
            System.out.println(tablaHecho);
            queryInicial+=" NATURAL JOIN "+correspondNomaTable.get(tablaHecho);
            contador++;
            Iterator it_lista= querysInternas.iterator();
            while(it_lista.hasNext())
            {
                
                queryInicial=" ( "+queryInicial+" ) AS "+nomQ+contador;
                contador++;
                String queryAnidado=" ( "+it_lista.next()+") AS "+nomQ+contador;
                contador++;
                queryInicial+=" NATURAL JOIN "+queryAnidado;
                contador++;
            }
            queryFrom+=queryInicial;
        }
        queryFrom+=") GROUP BY ";
        if(!(listaGroups.isEmpty())){
            Iterator it_lista= listaGroups.iterator();
            while(it_lista.hasNext())
            {
                queryFrom+=it_lista.next();
                if(it_lista.hasNext()) querySel+=" , ";
            }
        }
        
        query=querySel+"\n"+queryFrom;
        
        return query;
    }
    
        public void hacerConsulta(String sql, ConsultasDatamart consultador){
        
    //Hago consulta
        //
//        String sql= jta_queryTexto.getText();
        // La cadena a analizar sql
//        String cadena = "23+12=35";

        // Obtenemos un Pattern con la expresión regular, y de él
        // un Matcher, para extraer los trozos de interés.
//        String PruebA="(\\d+)\\+(\\d+)=(\\d+)";
//        Pattern patron = Pattern.compile("SELECT(\\s*\\w+\\s*,)*?(\\w+\\s*)FROM(?:\\w++);");
//        System.out.println("Cadena: "+sql);
//        Matcher matcher = patron.matcher(sql);

        // Hace que Matcher busque los trozos.
//        boolean pudo= matcher.find();

        // Va devolviendo los trozos. El primer paréntesis es el 1,
        // el segundo el 2 y el tercero el 3
//        for(int i=1; i<=matcher.groupCount();i++)
//        if(pudo)
//        System.out.println(matcher.group(1));
//        else System.out.println("No pudo");
        // La salida de este programa es
        // 23
        // 12
        // 35
        try{
            consultador.consultaGeneral(sql);
        }
        catch(SQLException excp)
        {
            excp.printStackTrace();
        }
    }
    
    private void jb_enviarQueryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jb_enviarQueryActionPerformed
        ButtonModel seleccion= bg_grupoPaQuery.getSelection();
        if(seleccion.equals(jtb_queryTexto.getModel())){
        jp_queryTexto.hacerConsulta();
//        cp_barra.(jfc_chartBarras);
        jfc_chartBarras=ChartFactory.createBarChart3D(
            "Consulta ",       // chart title
            "Marca",                    // domain axis label
            "Valor",                   // range axis label
            jp_queryTexto.getRsAsCategoryDataset(),                   // data
            PlotOrientation.VERTICAL,  // orientation
            true,                      // include legend
            true,                      // tooltips
            false                      // urls
        );
        jfc_chartTorta= ChartFactory.createPieChart3D("Consulta", jp_queryTexto.getRsAsPieDataset()
                , true, true, false);
        cp_torta.setChart(jfc_chartTorta);
        cp_barra.setChart(jfc_chartBarras);
//        cp_barra.repaint();
        }else{
//            si voy a enviar la query construida con el arbol
//            
            String query=this.armarQuery();
            ConsultasDatamart consultador= new ConsultasDatamart();
            jta_textQueryInter.setText(query);
            this.hacerConsulta(query, consultador);
            String hecho=this.listenerArbol.nodoHechoSeleccionado().toString();
            String [] colnamesPrueba={"Marca",hecho};
            jt_resultConsultaInter.setModel(consultador.getRsAsTableModel(colnamesPrueba));
            jfc_chartBarras=ChartFactory.createBarChart3D(
                "Consulta ",       // chart title
                "Marca",                    // domain axis label
                "Valor",                   // range axis label
                consultador.getRsAsCategoryDataset(),                   // data
                PlotOrientation.VERTICAL,  // orientation
                true,                      // include legend
                true,                      // tooltips
                false                      // urls
            );
            jfc_chartTorta= ChartFactory.createPieChart3D("Consulta", consultador.getRsAsPieDataset()
                    , true, true, false);
            cp_torta.setChart(jfc_chartTorta);
            cp_barra.setChart(jfc_chartBarras);
        }
    }//GEN-LAST:event_jb_enviarQueryActionPerformed
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTree arbolMenu;
    private javax.swing.ButtonGroup bg_grupoPaQuery;
    private javax.swing.JButton jb_enviarQuery;
    private javax.swing.JPanel jp_consulta;
    private javax.swing.JPanel jp_menuEstrellas;
    private javax.swing.JScrollPane jsp_scrollTree;
    private javax.swing.JScrollPane jsp_tablaResultadosInter;
    private javax.swing.JScrollPane jsp_textQueryInter;
    private javax.swing.JTable jt_resultConsultaInter;
    private javax.swing.JTextArea jta_textQueryInter;
    private javax.swing.JToggleButton jtb_formInteractivo;
    private javax.swing.JToggleButton jtb_queryTexto;
    private javax.swing.JTabbedPane jtp_pansGraficas;
    private org.jfree.chart.JFreeChart jfc_chartTorta;
    private org.jfree.chart.JFreeChart jfc_chartBarras;
    private org.jfree.chart.ChartPanel cp_torta, cp_barra;
    private javax.swing.JTabbedPane jtp_queryInter;
    // End of variables declaration//GEN-END:variables
}
